MediaTailor Ad insertionで広告付きVOD動画配信をやってみた [2024初夏編]

MediaTailor Ad insertionで広告付きVOD動画配信をやってみた [2024初夏編]

動画コンテンツや広告決定サーバとなる静的VASTレスポンスを自前で準備して、AWS Elemental MediaTailorでプリロール広告付きVOD動画配信を試してみます。CloudFrontとの連携についても確認してみました。
Clock Icon2024.05.30

はじめに

清水です。本ブログエントリではAWSのリニアチャネルアセンブリとパーソナライズされた広告挿入サービスであるAWS Elemental MediaTailorのAd insertion(広告挿入)機能を使い、VOD動画にプリロール広告をつけて配信をしてみます。

2024初夏編にあたり

この「MediaTailorを使ったプリロール広告付きVOD動画配信」ですが、実はおよそ5年前の2019年7月に以下ブログエントリで同様の内容を執筆しています。ではなぜ再び同じテーマでブログエントリを執筆するのでしょうか。ここでは過去ブログエントリとの差分などをまとめておきます。

個人的に、ここ最近MediaTailorではChannel assembly機能を扱うことが多く、Ad insertion機能についてはあまり触れてきませんでした。(MediaTailorのブログエントリのほとんどがChannel assemblyのアップデートとなっていますね。)そんな中、先日ひさしぶりにAd insertion機能を触ってみたのですが、上記ブログエントリで使用しているAWSのワークショップ(過去ブログエントリ内ではチュートリアルと表記)aws-media-services-simple-vod-workflowがアーカイブされていることに気が付きました。

さらに、以下の「MediaTailorを使ったプリロール広告付きライブ動画配信」ブログエントリ執筆時に参照したAWSのワークショップaws-media-services-simple-live-workflowについてもアーカイブになっています。

どちらのワークショップもドキュメントとしての参照はできるのですが、ワークショップ内で利用している環境が参照できなくなってしまっています。個人的にこれは痛いな、と思ったのがCloudFrontドメインでホスティングされていた広告決定サーバや広告動画などの参照ができなくなってしまっていたことです。過去のブログエントリではこのワークショップ内で参照していたCloudFrontドメインの(ワークショップ用の)広告決定サーバや広告動画を使用していたため、2024年初夏の現在は同様の設定を行ってもMediaTailorを使った広告付き動画配信ができなくなってしまっています。

ただ、新規に公開されているAWSワークショップを参照するとMediaTailorを試してみるということは可能です。2024年初夏の段階では、以下のOne Media WorkshopがAWS Media Servicesを網羅したワークショップとなっているかと思います。MediaTailorについてもAdvanced Topics (300+)で詳細に触れられていますね。

上記ワークショップの手順をなぞることでMediaTailorでを使った広告付き動画配信を行うことはできるのですが、再度ワークショップが更新されるとということも起こり得ます。ということで、今回は可能な限り自前のAWS環境内で完結する状態でMediaTailorの動作検証をしてみようというのが目的となります。

また以前のブログエントリよりもわかりやすくまとめたい、ということも執筆の目的です。当時はやっとMediaTailorが動いた!という興奮とともにブログエントリを執筆した記憶がありますが、あとから手順を確認する、再現するという点では改善の余地が大いにあるなと読み返したときに実感しました。今回のブログエントリでは少しでも再現が容易になるようにまとめられればと思っております。

本ブログエントリの「MediaTailorを使ったプリロール広告付きVOD動画配信」

ということで本ブログエントリでは、自前のAWS環境内で完結する状態での「MediaTailorを使ったプリロール広告付きVOD動画配信」ができるようにしていきます。自AWS環境内でということで、広告挿入部分はMediaTailorの基本的な動作確認のみを目的とした、静的VAST(static VAST)を利用してプリロール(preroll、動画本編の前に挿入される広告)のみを扱います。またMediaTailorとCloudFront連携についても確認します。

内容としては以下となります。左側の目次もあわせて活用ください。

  • 準備
    • VOD動画コンテンツの準備(MediaConvertでの変換を含む)
    • 広告決定サーバや広告動画の準備(静的VASTの準備を含む)
  • MediaTailor単体でVOD動画にプリロール広告挿入
  • MediaTailorをCloudFrontと連携させて広告付き動画配信

なお、本ブログエントリの執筆、MediaTailorやCloudFrontの設定については以下のAWSワークショップを参考にしています。(Public archive状態のものも含まれます。)

準備

まずは準備として、VOD動画コンテンツや広告決定サーバなどを作成していきます。MediaTailorを使ったプリロール広告付きVOD動画配信では、広告を挿入するもととなるVOD動画コンテンツ(ストリーム)と広告決定サーバが必要です。また広告決定サーバ内では広告となる動画も指定します。今回、広告決定サーバからは静的VASTレスポンスを返すこととします。この静的VASTレスポンス、ならびにこのVAST内で参照している広告動画についても準備します。

最終的には以下のように、VOD動画コンテンツをホスティングする環境(ドメイン)には動画コンテンツが格納され、広告決定サーバとなる環境(ドメイン)では静的VAST用XMLファイルと広告動画がホスティングされる状況となります。

https://content-source.example.com/
└── vod/
    ├── content01.m3u8  # VOD動画コンテンツその1
    ├── (そのほかcontent01のm3u8、tsファイル)
    ├── content02.m3u8  # VOD動画コンテンツその2
    └── (そのほかcontent02のm3u8、tsファイル)
https:///ad-decision.example.com/
└── ads/
    ├── ad-kichijoji-station-s1-15.mp4  # 挿入する広告動画
    └── static-vast-demo.xml  # 静的VASTレスポンス

今回は検証用ということで、Amazon S3をホスティング環境に使用して配信することとしました。動画コンテンツ用、広告決定サーバ用と2つのS3バケットを作成し、必要なファイルをオブジェクトとしてS3バケット内に配置していきます。

S3バケットの準備

バケットの作成

まずは各種コンテンツ配信用のS3環境の準備です。VOD動画コンテンツ用、広告決定サーバ用と2つのS3バケットを作成します。今回は以下の命名規則としました。(xxxxxxxx部分はランダムな英数小文字を設定しています。)

  • VOD動画コンテンツ用S3バケット
    • content-source-xxxxxxxx
  • 広告決定サーバ用S3バケット
    • ad-decision-xxxxxxxx

S3バケットの作成はマネジメントコンソールから行いました。[Create bucket]ボタンで進み、バケット名以外はデフォルトの設定のままS3バケットを作成しています。なお、リージョンは東京リージョン(ap-northeast-1)を使用しています。(以降、MediaTailorリソースについても同様です。)S3のURLが[Bucket name].s3.ap-northeast-1.amazonaws.comとなる点に留意しておきましょう。

バケットの公開権限の設定

S3バケットが作成できたら、続いて作成したS3バケットでコンテンツ配信を行うための公開設定を行います。s3:GetObject権限を開放しPublicRead、読み取りでアクセスを許可するS3とするかたちですね。

(なおコンテンツ配信をする環境と考えればS3単体ではなく、CloudFront+S3の構成で使用するのがベストプラクティスかと思います。今回は検証目的とういことでS3単体で使用しています。またMediaTailorからみてコンテンツオリジンとなる動画コンテンツ配信環境については、CloudFrontを前段に挟むべきかどうか、構成的に悩ましい点もあります。こちらは別の機会に考えてみたいと思います。)

まずは作成したS3バケットのBlock public access設定を変更します。バケットの詳細画面のPermissionsタブ、デフォルト設定でS3バケットを作成したので、"Block all public access"の状態ですね。この"Block all public access"のチェックをすべて外して無効とします。(ACLについてのBlock public access設定2種は有効のままでも目的は果たせそうですが、今回はシンプルにすべてのBlock設定を無効としました。)

Block public access設定を変更したら、続いてBucket policyを編集します。デフォルトはPolicyに何も設定されていない状態です。このPolicyに、PublicRead権限として以下のPolicyを設定します。DOC-EXAMPLE-BUCKETを実際のS3バケット名に置き換えます。

{
    "Version": "2012-10-17",
    "Id": "PublicReadForGetBucketObjects",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
        }
    ]
}

Bucket policy編集後、このS3バケットへアップロードしたファイル(オブジェクト)はすべて読み取り権限でアクセス可能になる点に留意しておきましょう。

動画コンテンツ用S3バケットにCORSを設定

動画コンテンツを格納し配信するS3バケットについては、Webブラウザ上の動画プレイヤーから動画コンテンツの再生ができるようにCORSを設定しておきます。

VOD動画コンテンツ用に作成したS3バケットcontent-source-xxxxxxxxの詳細ページ、PermissionsタブのCross-origin resource sharing (CORS)の項目を確認、デフォルトは何も設定されていない状態です。以下のJSONの内容で設定します。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

CORSはVOD動画コンテンツ用S3バケットcontent-source-xxxxxxxxにのみ設定が必要で、広告決定サーバ用S3バケットad-decision-xxxxxxxxには設定不要である認識です。また上記のCORS設定では、すべてのドメイン(Webサイト)上の動画プレイヤーから動画の再生が可能になります。本番環境などで特定のドメインのみに限定する場合はAllowedOriginsの値を適切に指定しましょう。

動画コンテンツの準備

続いてはVOD動画コンテンツの準備です。今回の検証ではVOD動画コンテンツはHLSストリームの形式とし、MediaConvertで変換して準備しました。Jobの作成については既存のJob template(System template)をベースにしますが、ABRのrenditionとName modifierを変更するためにCustom templateを作成してこれを使用します。

MediaConvertのCustom templateの作成

具体的には、Job templatesでSystem templatesのOTT-HLS、System-Ott_Hls_Ts_Avc_Aacをまずは選択、これを[Duplicate]してCustom templateを作成します。

Nameを適切に設定し、Output groupsのApple HLSの設定に進みます。

Outputsの箇所、8つのABR renditionがならびますが、このうち_Ott_Hls_Ts_Avc_Aac_16x9_640x360p_30Hz_1200Kbps(上から3つ目)と_Ott_Hls_Ts_Avc_Aac_16x9_1280x720p_30Hz_5000Kbps(上から6つ目、下から3つ目)以外を削除します。(スクリーンショット中、Name modifier欄が見切れてしまっていますが右にカーソルを進めて確認しましょう。)

また出力ファイル名をシンプルにするため、_Ott_Hls_Ts_Avc_Aac_16x9_640x360p_30Hz_1200Kbps_360p_Ott_Hls_Ts_Avc_Aac_16x9_1280x720p_30Hz_5000Kbps_720pになるようName modifierを設定します。

2つのABR renditionのみが残っていることとName modifierの変更を確認して[Create]ボタンを押下、Custom templateを作成します。

MediaConvertのJobの作成

作成したCustom templateの詳細画面から[Create job]ボタンでHLSストリーム作成のJobを設定していきます。

Job作成の際、出力先(Apple HLS group settingsのDestination)は先ほどVOD動画コンテンツ用に作成したS3バケットcontent-source-xxxxxxxx内のパス/vod/としておきます。

  • s3://content-source-xxxxxxxx/vod/

Job settings内のAWS integrationにあるIAMロールの設定を忘れずに行い、[Create]ボタンでJobを作成します。

なお入力は別途準備したS3バケットにアップロード済みのcontent01.movcontent02.movという2種の動画です。(合計2つのJobを作成、2種類のVOD動画コンテンツを準備しました。)

どちらもスマホで井の頭公園を撮影したもので、尺は1分と少し。Macのクイックルックで確認すると以下のようなコンテンツとなります。

変換後のHLSストリームの再生確認

MediaConvertで作成したJobがCompleteとなったら、出力先のS3を参照しHLSストリームの再生URLを確認しておきましょう。以下のようなURLとなりました。(URL最後のm3u8のファイル名、content01content02に変更すれば2つ目のVOD動画コンテンツのHLSストリームとなります。)

  • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8

この時点で通常のHLSストリームとして動画プレイヤーで再生が可能か確認しておきます。本エントリ内、動画プレイヤーとしてはhls.js demoを使用しました。ページを開き、設定項目左上のhttps://で始まる箇所にMediaConvertで変換したHLSストリームの再生URLを入力して[Apply]します。

想定した動画コンテンツがストリーミング再生されること、エラーなどが表示されないことを確認しておきましょう。

広告用動画の準備

次は広告用の動画を準備します。この広告用の動画は各ワークショップなどを参考にMP4形式で準備することとしました。尺は15秒となるようにします。これもMediaConvertを使って変換しました。

もととなる動画はスマホで吉祥寺駅を撮影したものを準備、こちらもMacのクイックルックで確認すると以下のようなコンテンツとなります。(井の頭公園はVODコンテンツ本編、吉祥寺駅なら広告用動画、という区別をしています。)

MediaConvertのマネジメントコンソール、[Create job]からInputにS3にアップロードしたもと動画ファイルを指定、Input clipsで15秒の尺になるようEnd timecodeを設定します。

Output groupsはFile groupsを選択、PreestはSystem presetsのGeneric-HDカテゴリ内、System-Generic_Hd_Mp4_Avc_Aac_16x9_Sdr_1280x720p_30Hz_5Mbps_Qvbr_Vq9を使用しました。

また出力先は広告決定サーバ用S3バケットとします。ここで、s3://ad-decision-xxxxxxxx/ads/ad- とパス部分も含めてDestinationに指定します。またName modifierに$fn$-15、 Extensionに.mp4と指定することで、変換後の動画がs3://ad-decision-xxxxxxxx/ads/ad-[元のファイル名(拡張子なし)]-15.mp4と出力されるようにしました。

Jobを作成してMediaConvertの変換が完了したら、広告用動画のURLを確認しておきましょう。変換後のMP4動画のS3オブジェクト詳細画面を開きObject URLを確認します。以下のようになりました。

  • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4

S3バケット内で公開状態になっているかも確認しておきましょう。curlコマンドに-Iオプションを付けて実行、以下のようなレスポンスヘッダが確認できました。

% curl -I https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4
HTTP/1.1 200 OK
x-amz-id-2: po7ixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+Q==
x-amz-request-id: 48xxxxxxxxxxxx1G
Date: Tue, 28 May 2024 06:59:18 GMT
Last-Modified: Tue, 28 May 2024 06:56:24 GMT
ETag: "31xxxxxxxxxxxxxxxxxxxxxxxxxxxx69"
x-amz-server-side-encryption: AES256
x-amz-meta-mediaconvert-jobid: 17xxxxxxxxx96-6xxxxx
Accept-Ranges: bytes
Content-Type: video/mp4
Server: AmazonS3
Content-Length: 7831258

広告決定サーバとなるstatic VASTの準備

続いては広告決定サーバの準備です。広告決定サーバでは本来、アクセスしているユーザ情報などに応じて広告を出し分ける機能などを有するかと思いますが、本章のはじめに述べたとおり本エントリでは広告決定サーバからは静的VASTレスポンスを返し、この静的VASTを用いて固定のプリロール広告をVOD動画へ挿入するという動作の検証とします。

本節ではこの静的VASTを作成、S3バケットに配置します。リクエストに対してこの静的VAST用XMLファイルをレスポンスとして返すことで、広告決定サーバの代用とします。VASTの作成には以下のAWS for M&E Blogのエントリを参考にしました。

以下のファイルstatic-vast-demo.xmlを準備しました。上記AWS for M&E Blogのエントリ内のサンプルXMLから12行目のwidthheight、そして13行目の広告動画のURLを変更しています。それぞれ、実際に使用する広告動画にあわせるかたちですね。

<VAST version="3.0">
  <Ad>
    <InLine>
      <AdSystem>2.0</AdSystem>
      <AdTitle>ad-1</AdTitle>
      <Impression/>
      <Creatives>
        <Creative>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720">
                <![CDATA[https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

広告決定サーバ用S3バケットのパス/ads配下にアップロード、以下のURLでアクセスできることを確認しておきます。

  • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml

以下、S3バケットにアップロード後にcurlコマンドで確認した例です。公開状態となっているかも確認しておきましょう。

% curl -i https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml
HTTP/1.1 200 OK
x-amz-id-2: szguxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2kg=
x-amz-request-id: FPxxxxxxxxxxxxEK
Date: Tue, 28 May 2024 07:21:00 GMT
Last-Modified: Tue, 28 May 2024 07:20:22 GMT
ETag: "80xxxxxxxxxxxxxxxxxxxxxxxxxxxx9d"
x-amz-server-side-encryption: AES256
Accept-Ranges: bytes
Content-Type: text/xml
Server: AmazonS3
Content-Length: 616

<VAST version="3.0">
  <Ad>
    <InLine>
      <AdSystem>2.0</AdSystem>
      <AdTitle>ad-1</AdTitle>
      <Impression/>
      <Creatives>
        <Creative>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720">
                <![CDATA[https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

準備完了

以上で「MediaTailorを使ったプリロール広告付きVOD動画配信」のための準備が完了しました。広告を挿入するもととなるVOD動画コンテンツ、広告用の動画、広告決定サーバ、それぞれがAWS環境内(S3バケット内)でホスティングされている状態です。

以下、改めて準備した内容のURLをまとめておきましょう。なお、VOD動画コンテンツ用S3バケットとしてcontent-source-xxxxxxxx、広告決定サーバ用S3バケットとしてad-decision-xxxxxxxxをそれぞれ東京リージョンに作成している想定となります。

  • VOD動画コンテンツ(ストリーム再生URL)
    • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8
    • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content02.m3u8
  • 広告用動画
    • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4
  • 広告決定サーバ(static VAST)
    • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml

MediaTailor単体でVOD動画にプリロール広告挿入

それではいよいよMediaTailorを使ったプリロール広告付きVOD動画配信を行っていきます。本番環境向けではMediaTailorとCloudFrontの連携は必須と考えますが、まずはMediaTailorのみでの広告付き動画配信を設定、実際に再生できるか動作を確認していきましょう。

MediaTailor Configurationリソースの作成

MediaTailorのConfigurationリソースを作成します。設定内容は以下です。その他の項目はデフォルト値(もしくは指定しない状態)で進めました。

  • Name
    • 任意のConfigurationリソース名。今回はvod-prerollとしました
  • Content source
    • 動画コンテンツ(VOD動画本編)のURLを指定します。パスの一部を指定することも可能です
    • 今回は動画コンテンツをホスティングしている環境のドメイン部分までを指定しました
      • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com
  • Ad decision server
    • 広告決定サーバのURLを指定します
    • 今回は静的VASTレスポンスのURLを指定しました
      • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml

MediaTailorのマネジメントコンソール、Ad insertionのConfigurationsの画面に進み[Create configuration]ボタンからリソースを作成します。

広告付き動画の再生URLの確認

Configurationが作成できたら、広告付き動画の再生URLを確認していきます。

まずベースとなるのは事前に準備したVOD動画コンテンツの再生URLです。以下の形式のものでした。

  • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8

ここからパス部分/vod/content01.m3u8を控えておきます。

続いて作成したConfigurationの詳細画面を確認しましょう。Content & origin detailsのPlayback endpoint prefixes、HLS playback prefixの項目に注目します。

以下の形式のURLになっていますね。

  • https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/

この末尾に、先ほど確認した広告挿入もととなるVOD動画コンテンツ再生URLのパスの部分、/vod/content01.m3u8を加えます。すると以下のようなURLが生成できますね。

  • https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8

2つめのVOD動画コンテンツであれば、パス部分が/vod/content02.m3u8なので以下のようになります。

  • https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content02.m3u8

これがMediaTailorで広告が挿入された状態の動画再生URLとなります。

動画プレイヤーでの視聴確認

広告付き動画の再生URLが確認できたところで、実際にこのURLを動画プレイヤーに指定して視聴確認をしてみます。hls.js demoのページで以下の広告付き動画再生URL(再掲)を指定します。

  • https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8

冒頭、15秒間は吉祥寺駅の映像、つまり広告動画が再生されました。

15秒経過して広告動画が終わると井の頭公園の映像、VOD動画コンテンツ本編が再生されました。

プリロール広告付きのVOD動画配信ができましたね!2つ目のVOD動画コンテンツについてもURL末尾のm3u8ファイルの名称を変更すれば再生可能です。なお再生の際、広告部分だろうがVOD動画本編だろうが自由な位置にシークが可能です。また動画プレイヤー側に表示される動画の尺は広告動画とVOD動画本編をあわせたものになっています。これらは動画プレイヤーの仕様で、例えば広告動画はシークできないようにしたり、広告動画とVOD動画本編で動画の尺を別に表示する、といったことは動画プレイヤー側で処理を実装しないと実現できないもの、と考えています。

また広告付き動画の初回再生のタイミングなどでは、広告動画が表示されない場合があります。これは広告動画が動画コンテンツに一致する形式でまだトランスコードされていないことが原因です。数分などしばらくして再度再生を行えば広告動画が表示されるかと思います。この初回トランスコードについては、MediaTailorのUser Guideや、またVAST用XMLのレスポンス作成時に参考にしたAWS for M&E Blogのエントリにも記載があります。

MediaTailorをCloudFrontと連携させて広告付き動画配信

MediaTailor単体でのプリロール広告付きVOD動画配信ができました。続いてはこのMediaTailorとCloudFrontを連携させ、CloudFront経由のVOD動画配信環境としていきたいと思います。

なお、MediaTailorとCloudFrontの連携については以下のAWSワークショップを基本的な設定例として参考にしています。

最新のAWSワークショップOne Media WorkshopのMediaTailor advanced featuresのページでは、これとは別のパターンでCloudFront連携を行っています。User GuideのWorking with CDNsとあわせて設定内容について比較してみるとよいかと思います。

MediaTailorとCloudFrontを連携させる場合、まずはMediaTailorのConfigurationをCloudFront設定(CDN連携設定)なしで作成します。本エントリではこのConfigurationは先ほど作成したもの(vod-preroll)を使用します。続いて、このMediaTailorのConfiguration(正確にいえばそのPlayback endpoint)をオリジンとしてCloudFront Distributionを作成します。CloudFront Distributionではそのほか、VOD動画コンテンツ配信元をオリジンとするなどの設定を行います。CloudFront Distributionの準備ができたら、このCloudFront DistributionのDomain nameをMediaTailor ConfigurationにCDN設定として登録します。MediaTailorとCloudFrontの設定を行ったり来たりする感じで少々複雑になりますので注意して設定を進めましょう。

CloudFront Distributionの作成と設定

まずはCloudFront Distributionを作成し各種設定を行っていきます。

Distributionの作成に入る前に、CloudFrontの連携先となるMediaTailor ConfigurationのPlayback endpointのドメイン名が必要になるので事前に確認しておきましょう。広告付き動画の再生URLを参照します。今回は以下が再生URLですので、67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.comがMediaTailor Configurationのドメイン名となります。

  • https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8

またCloudFront Distributionの設定についてあらかじめまとめておきます。CloudFrontのOriginとしては以下3種類が登録されている状況となります。

Origin name (任意の名称) Origin domain 備考
mediatailor-ad-origin segments.mediatailor.ap-northeast-1.amazonaws.com リージョンごとに固定 (参考: Integrating a CDN
content-source-origin content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com VOD動画コンテンツ配信元のドメイン名
mediatailor-origin 67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com MediaTailor ConfigurationのPlayback endpointのドメイン名

Behaviorについては以下のようなPrecedence、Path patternとOriginが設定されている状態が最終形です。

Precedence Path pattern Origin
0 /v1/* mediatailor-origin
1 /vod/* content-source-origin
2 Default (*) mediatailor-ad-origin

それぞれのBehaviorごとのPolicy設定は以下としました。

Path pattern Cache policy Origin request policy Response header policy
/v1/* CachingDisabled AllViewerAndCloudFrontHeaders-2022-06 SimpleCORS
/vod/* CachingOptimized - CORS-With-Preflight
Default (*) CachingOptimized - CORS-With-Preflight

(なお、Path patternのわけ方はaws-media-services-simple-vod-workflow/11-VODMediaTailorを、CacheなどPolicy設定についてはOne Media WorkshopのMedia segment prefixesの項目をそれぞれ参考にしています。

以下、実際の設定画面などをまとめていきます。

VOD動画コンテンツ配信元をOriginとしてCloudFront Distributionを作成

まずはマネジメントコンソールからCloudFront Distributionを作成していきます。この際、OriginはVOD動画コンテンツ配信元を指定します。今回でいえばVOD動画コンテンツ用S3バケットcontent-source-xxxxxxxxになりますね。

CloudFrontのマネジメントコンソール、[Create distribution]ボタンから進みOrigin domainにはcontent-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.comを指定します。Nameの項目ではOriginの区別がしやすいようにcontent-source-originとしておきました。Origin accessは使用せずPublicとして進めます。

Default cache behaviorの設定の設定については後ほど変更するのでデフォルトのままとします。またWeb Application Firewall (WAF)の設定について、今回は検証用とということでDo not enable security protectionsを選択しました。あとでわかりやすいようにDescriptionを適切に設定して(今回はCloudFront for MediaTailor VOD prerollとしました)[Create Distribution]します。

MediaTailor Origin 2種の追加

続いて作成した(作成直後のDeploying状態の)CloudFront DistributionにOriginを追加していきます。MediaTailor用の2種類を追加するかたちです。Originsの項目から[Create origin]ボタンを押下します。

1つ目のOriginはMediaTailor ConfigurationのPlayback endpointのドメイン名をOrigin domainに指定します。今回であれば67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.comですね。ProtocolとしてHTTPS onlyとなっていることを確認しておきましょう。またNameではmediatailor-originと指定しておきます。その他の項目はデフォルト値のまま、[Create origin]します。

さらにもう1つのOriginも追加します。同様に[Create origin]ボタンで進みます。Origin domainではsegments.mediatailor.ap-northeast-1.amazonaws.comを指定します。このドメイン名はリージョンごとに固有のものとなっています。(参考: Integrating a CDN)こちらもProtocolとしてHTTPS onlyとなっていることを確認しておき、Nameではmediatailor-ad-originと指定しました。その他の項目はデフォルト値で[Create origin]します。

2種のOriginを追加後、Originは以下のように3種類が登録されている状況となります。

Behavior「/vod/*」の追加

Originを追加したら、続いてはBehaviorを追加していきます。まずはPath pattern /vod/*のBehaviorです。この/vod/*のパスについては、VOD動画コンテンツを配信するかたちになるのでcontent-source-originに振り分けるかたちですね。

Behaviorsの項目の[Create behavior]ボタンから進みます。Path patternでは/vod/*と入力、Origin and origin groupsではcontent-source-originを選択します。またViewer protocol policyではRedirect HTTP to HTTPSを選択しました。Cache key and origin requestsではCache policy: CachingOptimized、またResponse headers policy: CORS-With-PreflightとしてBehaviorを作成します。

Behavior「/v1/*」の追加

続いてもう1つBehaviorを追加します。今度はPath patternが/v1/*のBehaviorです。この/v1/*のパスについてはMediaTailor ConfigurationのPlayback endpoint、mediatailor-originの名称で登録したOriginiにリクエストが振り分けられるようにします。

先ほどと同様に[Create behavior]ボタンから進み、Path patternでは/v1/*と入力します。Origin and origin groupsではmediatailor-originを、Viewer protocol policyでRedirect HTTP to HTTPSを選択します。Allowed HTTP methodsではGET, HEAD, OPTIONS, PUT, POST, PATCH, DELETEを選択しましょう。Cache key and origin requestsではCache policy: CachingDisabled、Origin request policy: AllViewerAndCloudFrontHeaders-2022-06、Response headers policy: SimpleCORSとしてBehaviorを作成します。

Behavior「Default (*)」の編集

デフォルトのBehaviorDefault (*)を編集します。Distribution作成時にOriginをcontent-source-originとして指定していましたが、これをmediatailor-ad-originに変更して細かな設定を行います。

Behaviors一覧画面でPath pattern Default (*)を選択して[Edit]ボタンで進みます。Origin and origin groupsではmediatailor-ad-originを選択します。Viewer protocol policyはRedirect HTTP to HTTPSを選びます。Cache key and origin requestsではCache policy: CachingOptimized、またResponse headers policy: CORS-With-Preflightを選択して、[Save changes]します。

Behaviorの優先順位の確認と調整

CloudFront DistributionへのOriginならびにBehaviorの追加、設定変更が完了しました。CloudFront Distributionの設定の最後にBehaviorの優先順位(Precedence)の確認と調整をしておきましょう。Default (*)以外の動作、/vod/*/v1/*についてはそれぞれで独立しているため、どちらが先になっても動作に支障はなさそうですが、参考にしたAWSワークショップにならい、優先順位 0(Precedence 0)を/v1/*mediatailor-origin、優先順位 1(Precedence 1)を/vod/*content-source-originとしておきます。Default (*)mediatailor-ad-originが優先順位 2(Precedence 2)となっていることも確認しておきましょう。優先順位の変更に必要がある場合は変更対象のBehaviorを選択して[Move up]または[Move down]し、順位を変更します。最後に忘れずに[Save]しましょう。

以下が最終的なBehaviorsのPrecedenceのならびです。

MediaTailor ConfigurationでCDN連携を設定

MediaTailor Configurationの連携先となるCloudFront Distributionの作成と設定ができました。続いてはMediaTailor Configuration側に、このCloudFront DistributionのDomain nameを設定します。

Configurationの設定前に、あらかじめCloudFrontのDomain nameを確認しておきます。Distribution詳細画面のGeneralのタブ、DetailsのDistribution domain nameが今回であれば。該当しますね https://d2p0xxxxxxxxxx.cloudfront.netとなります、Copyボタンでクリップボードにコピーして控えておきましょう。

MediaTailorのConfigurationの詳細ページに進みます。Content & origin detailsタブのCDN settingsの項目、どちらも値が設定されていない状態ですが、この箇所を変更していきます。[Edit]ボタンで進みましょう。

Edit configuration画面でAdvanced settingsの項目を展開します。表示されるCDN content segment prefix、CDN ad segment prefixのそれぞれに、先ほど確認したCloudFront DistributionのDomain nameをhttps://から入力します。https://d2p0xxxxxxxxxx.cloudfront.netというぐあいですね。

[Save configuration]します。遷移後のConfiguration詳細画面のCDN settingsの項目が正しく設定されていることを確認しておきましょう。

以上でMediaTailorのCloudFront連携の設定は完了です。

CloudFront連携時の広告付き動画再生URLの確認

MediaTailorとCloudFront(CDN)連携の設定ができたところで、このCloudFront連携時の広告付き動画再生URLについて確認しましょう。CloudFrontと連携しない状態、MediaTailor単体で広告付き動画再生URLは以下の形式でした。

  • https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8

このURLのドメイン名部分、67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.comのところをCloudFront DistributionのDomain nameに変更します。今回であればd2p0xxxxxxxxxx.cloudfront.netですね。以下がMediaTailorとCloudFront連携時の広告付き動画再生URLです。

  • https://d2p0xxxxxxxxxx.cloudfront.net/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8

2つ目のVOD動画コンテンツの場合は末尾のパス部分が変わり、以下のようになります。

  • https://d2p0xxxxxxxxxx.cloudfront.net/v1/master/75xxxxxxxx/vod-preroll/vod/content02.m3u8

CloudFront連携した広告付き動画をプレイヤーで視聴

CloudFront連携した際の広告付き動画再生URLが確認できました。このURLをhls.js demoページで視聴してみます。CloudFront経由での配信ですが、MediaTailor単体での視聴の際と同様に視聴ができますね。

これだけだとCloudFront経由であるかわかりにくいため、Google Chromeのデベロッパーツールを使って詳細を確認してみます。それぞれのファイルがCloudFront経由での配信となっていることが確認できます。

まとめ

AWS Elemental MediaTailorのAd insertion(広告挿入)機能で、プリロール広告付きVOD動画配信をしてみました。AWSワークショップの手順にならいながら、VOD動画コンテンツにはじまり広告用の動画や広告決定サーバ代わりとなるstatic VASTのレスポンスについても準備し自AWS環境に配置しました。またAWSのCDNサービスであるAmazon CloudFrontとMediaTailorとの連携についても設定し、CloudFront経由のプリロール広告付きVOD動画配信についても確認してみました。

広告決定サーバのレスポンスが静的なVASTで、固定した広告動画がVODコンテンツ本編の前に流れるというシンプルな動作ですが、MediaTailor Ad insertionの動作の基本が押さえられたかと思います。個人的には冒頭で述べた通り、過去に試していたAWSワークショップがそのままでは動かなくなっていて、という点を自前のAWS環境で実現することでこれを回避、数年後もきっと動作する手順としてまとめられたかなと思いってます。とはいえ、MediaTailorはChannel AssemblyだけではなくAd insertionも機能アップデートをしっかり追っていかなければと思ったしだいでした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.